package fsmsim.dataStructure;

/**
 * <p>Title: FSMSim</p>
 *
 * <p>Description: Simulatore di macchine a stati finiti.</p>
 *
 * <p>Copyright: Copyright (c) 2008</p>
 *
 * <p>Company: Bollati, Donati, Gabrielli, Peli</p>
 *
 * @author Bollati, Donati, Gabrielli, Peli
 * @version 3.0
 */

public class Transition extends Element {

    public static final int INITIAL_STATE = 0;
    public static final int INPUT_EVENT = 1;
    public static final int OUTPUT_EVENT = 2;
    public static final int FINAL_STATE = 3;
    
    private Container transition;

    
    /**
     * Costruttore
     * @param name
     */

    public Transition(String name) {
        super(name);
        if (Container.CONTAINER_TYPE == 0) 
            this.transition = new ContainerVector();
        else
            this.transition = new ContainerArrayList();
    }
    
    
    /**
     * Restituisce la transitione
     * @return
     */
    
    public Container getTransizion() {
        return this.transition;
    }

    
    /**
     * Aggiunge un elemento all'oggetto composto: transizioni
     * @param aElement
     */
       
    public void addElement(Element aElement) {
        this.getTransizion().addElement(aElement);
    }
    
    
    /**
     * Rimuove un elemento dall'oggetto composto: transizioni
     * @param aElement
     */
    
    public void removeElement(Element aElement) {
        this.getTransizion().removeElement(aElement);
    }
    
    
    /**
     * Restituisce l'elemento nella posizione rischiesta
     * @param position
     * @return
     */
    
    @Override
    public Element getElement(int position) {
        return getTransizion().getElement(position);
    }

    
    /**
     * Metodo toString
     * @return
     */
    
    @Override
    public String toString() {
        String s = "";
        for (int i = 0; i < getTransizion().size(); i++) {
            if (getTransizion().getElement(i) == null)
                s += "-" + " | ";
            else 
                s += getTransizion().getElement(i).toString() + " | ";
        }
        return s;
    }

    
    /**
     * Controlla se l'oggetto passato corrisponde alla giusta transizione
     * @param aElement
     * @return
     */

    public boolean matchElement(Element aElement) {
        return (this.getTransizion().getElement(INITIAL_STATE).matchElement(((Transition) aElement)
                .getTransizion().getElement(INITIAL_STATE)) && 
                (getTransizion().getElement(INPUT_EVENT).matchElement(((Transition) aElement).
                getTransizion().getElement(INPUT_EVENT))));
    }

}
